﻿using System;
using System.Linq;
using System.Collections.Generic;
using SIM.Geo.DA;
using SIM.Geo.BE;


namespace SIM.Geo.BL
{
    /// <summary>
    /// Clase de la capa de negocio que gestiona Labores
    /// </summary>
    public class BLLabor
    {
        #region Metodos

        /// <summary>
        /// Metódo que devuelve lista de labor
        /// </summary>
        /// <returns></returns>
        public List<Labor> Listar()
        {
            return Accesor.Listar();
        }

        /// <summary>
        /// Metodo que inserta un nuevo labor
        /// </summary>
        /// <param name="labor"></param>
        /// <returns></returns>
        public int Insertar(Labor labor)
        {
            int codigoNuevo = this.GenerarCodigo();
            labor.CodigoLabor = codigoNuevo;
            return Accesor.Insertar(labor);
        }

        /// <summary>
        /// Metodo que modifica labores
        /// </summary>
        /// <param name="labor"></param>
        public void Modificar(Labor labor)
        {

            var laborEdit = Accesor.Obtener(labor.CodigoLabor);
            laborEdit.NombreLabor = labor.NombreLabor;
            laborEdit.Nivel = labor.Nivel;
            laborEdit.CodigoZona = labor.CodigoZona;
            laborEdit.CodigoCuerpo = labor.CodigoCuerpo;
            laborEdit.Seccion = labor.Seccion;
            laborEdit.CodigoCategoriaLabor = labor.CodigoCategoriaLabor;
            laborEdit.CodigoTipoLabor = labor.CodigoTipoLabor;
            laborEdit.CodigoDireccion = labor.CodigoDireccion;
            laborEdit.DireccionChimenea = labor.DireccionChimenea;
            Accesor.Modificar(laborEdit);
        }

        /// <summary>
        /// Metodo que elimina labor
        /// </summary>
        /// <param name="labor"></param>
        public void Eliminar(int codigoLabor)
        {
            var labor = Accesor.Obtener(codigoLabor);
            Accesor.Eliminar(labor);
        }

        /// <summary>
        /// Metodo que buscar por nombre de labor
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<LaborResponse> Buscar(string nombre)
        {

            return Accesor.Buscar(nombre);

        }
        /// <summary>
        /// Busca labores
        /// </summary>
        /// <param name="nombre"></param>
        /// <returns></returns>
        public List<buscarLabor_Result> Buscar1(string nombre)
        {
            return Accesor.Buscar1(nombre);
        }
        /// <summary>
        /// Metodo que devuelve un Labor por código
        /// </summary>
        /// <param name="codigoLabor"></param>
        /// <returns></returns>
        public Labor Obtener(int codigoLabor)
        {

            var labor = Accesor.Obtener(codigoLabor);
            labor.TipoLabor = new DATipoLabor().Obtener(labor.CodigoTipoLabor);
            if (labor.CodigoDireccion != null) labor.DireccionLabor = new DADireccionLabor().ObtenerDireccionLabor((int)labor.CodigoDireccion);
            return labor;
        }

        /// <summary>
        /// Metodo que devuelve un Labor por código
        /// </summary>
        /// <param name="codigoLabor"></param>
        /// <returns></returns>
        public int GenerarCodigo()
        {
            int codigoMaximo = 1;
            var lista = Accesor.Listar();
            if (lista.Count > 0)
            {
                codigoMaximo = lista.OrderByDescending(x => x.CodigoLabor).FirstOrDefault().CodigoLabor + 1;
            }

            return codigoMaximo;
        }

        /// <summary>
        /// Devuelve la lista para ComboBox, DropdownList, devuelve campos Value y Text
        /// </summary>
        /// <returns></returns>
        public List<ListItemInt> ObtenerListItem()
        {

            var result = Accesor.Listar();
            return result
                .Select(x => new ListItemInt { Value = x.CodigoLabor, Text = x.NombreLabor }).OrderBy(x => x.Text).ToList();

        }

        /// <summary>
        /// Valida si existe nombre de labor por cuadrante, si existe retorna true, si no false, y codigo a validar es distinto al codigo indicado
        /// </summary>
        /// <param name="nombreLabor"></param>
        /// <param name="cuadrante"></param>
        /// <returns></returns>
        public bool ValidarNombreLabor(string nombreLabor, int cuadrante, int codigoLabor)
        {
            bool retorno = true;
            var labor = Accesor.ObtenerLaborPorNombreYCuadrante(nombreLabor, cuadrante);
            if (labor != null)
            {
                if (labor.CodigoLabor != codigoLabor)
                {
                    retorno = false;
                }
            }

            return retorno;
        }
        /// <summary>
        /// Valida si existe nombre de labor por cuadrante, si existe retorna true, si no false, y codigo a validar es distinto al codigo indicado
        /// </summary>
        /// <param name="nombreLabor"></param>
        /// <param name="cuadrante"></param>
        /// <returns></returns>
        public bool ValidarNombreLabor1(string nombreLabor, int codigoLabor)
        {
            bool retorno = true;
            var labor = Accesor.ObtenerLaborPorNombre(nombreLabor);
            if (labor != null)
            {
                if (labor.CodigoLabor != codigoLabor)
                {
                    retorno = false;
                }
            }

            return retorno;
        }
        /// <summary>
        /// Genera nombre de Labor
        /// </summary>
        /// <returns></returns>
        public string GenerarNombreLabor(int codigoTipoLabor, string nivel, string seccion, int codigoDireccion, string direccionChimenea)
        {

            if (codigoTipoLabor == 0 || nivel.Length == 0 || seccion.Length == 0)
            {
                return string.Empty;
            }

            string nombreGenerado = string.Empty;
            var tipoLabor = new DATipoLabor().Obtener(codigoTipoLabor);
            var direccion = new DADireccionLabor().ObtenerDireccionLabor(codigoDireccion);
            string nivelGenerar = nivel.PadLeft(3, '0');
            string seccionGenerar = string.Empty;

            int nseccion = int.Parse(seccion);
            int divisor = 10;
            if (nseccion % divisor != 0)
            {
                return string.Empty;
            }
            nseccion = nseccion / divisor;
            seccion = nseccion.ToString().Trim();
            seccionGenerar = seccion.PadLeft(3, '0');

            string direccionCorta = string.Empty;
            if (direccion == null)
            {
                direccionCorta = "-" + direccionChimenea;
            }
            else
            {
                if (direccion != null) direccionCorta = direccion.DescripcionCorta;
            }

            if (tipoLabor == null)
            {
                nombreGenerado = string.Empty;
            }
            else
            {
                nombreGenerado = tipoLabor.NombreCorto + nivelGenerar + '-' + seccionGenerar + direccionCorta;
            }

            return nombreGenerado;
        }

        #endregion

        #region Accesor
        private static DALabor Accesor
        {
            [System.Diagnostics.DebuggerStepThrough]
            get { return new DALabor(); }
        }
        #endregion
    }
}